Java applications may be executed within a variety of commercially available Java virtual machine (JVM) execution frameworks. A JVM can be installed on a server computer to act as a virtual application server within the actual server. One feature of a typical JVM is a memory area known as the heap, where objects created during the execution of a Java program can be stored. The JVM can periodically perform a garbage collection procedure on the heap, during which memory locations used by objects that are no longer referenced by the program are freed for other uses. This automated garbage collection process can relieve the Java programmer from the task of writing code to release the memory allocated to objects that are no longer used.
The heap can be divided into at least two sections or generations. Recently created objects are placed in a young generation. As the young generation fills up, a minor or incremental garbage collection procedure can be performed, in which memory space used by objects that are no longer referenced by the Java program is reclaimed. Objects that are still being referenced are moved to an old or tenured generation. As the old generation fills up, a major garbage collection procedure can be performed. A major garbage collection involves an examination of all objects in both the young and old generations and can therefore last much longer than a minor garbage collection.
Since all application processing stops while a minor or major garbage collection event is occurring, it may be desirable to reduce the amount of time spent in garbage collection. This is especially relevant for a multi-processor system since only one of the plurality of processors can perform garbage collection at a given time. Throughput in such a system might be greatly reduced since the other processors in the system remain idle while a single processor performs garbage collection.